package com.project.gobang.game;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.concurrent.ConcurrentHashMap;

@Component
// 注意 Spring Bean 的作用域, 该类属于 singleton, 在 IOC 容器中是单例模式, 在该容器内仅存在一个
public class OnlineUserManager {
    // 这个哈希表就用来表示当前用户在游戏大厅在线状态
    private ConcurrentHashMap<Integer, WebSocketSession> gameHall = new ConcurrentHashMap<>();

    // 这个哈希表用来 维护用户在 "游戏房间" 的在线状态
    private ConcurrentHashMap<Integer, WebSocketSession> gameRoom = new ConcurrentHashMap<>();

    // 用户进入游戏大厅, 用户在游戏大厅是在线的 (插入哈希表)
    public void enterGameHall(int userId, WebSocketSession webSocketSession) {
        gameHall.put(userId, webSocketSession);
    }

    // 用户离开游戏大厅, 用户在游戏大厅页面是离线的 (删除哈希表中对应的key)
    public void exitGameHall(int userId) {
        gameHall.remove(userId);
    }

    // 获取用户当前在游戏大厅的在线状态
    public WebSocketSession getUserOnlineStatusInHallSession(int userId) {
        return gameHall.get(userId);
    }

    // 用户进入 "游戏房间", 用户在 游戏房间 是在线的 (插入哈希表)
    public void enterGameRoom(int userId, WebSocketSession webSocketSession) {
        gameRoom.put(userId, webSocketSession);
    }

    // 用户离开 "游戏房间", 用户在 游戏房间 页面是离线的 (删除哈希表中对应的key)
    public void exitGameRoom(int userId) {
        gameRoom.remove(userId);
    }

    // 获取用户当前在 "游戏房间" 的在线状态
    public WebSocketSession getUserOnlineStatusInRoomSession(int userId) {
        return gameRoom.get(userId);
    }
}
